package com.qfedu.demo.shiro.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Map;

@Controller
public class MainController {

    private final static Logger LOG = LoggerFactory.getLogger(MainController.class);

    /**
     * 采用authc过滤器
     * @return
     */
    @GetMapping("/")
    String toMain () {
        // 获取shiro中的用户信息，类似于之前从session中获取用户信息
        String user = (String)SecurityUtils.getSubject().getPrincipal();
        LOG.info("当前用户：" + user);
        return "main";
    }

    /**
     * 采用user过滤器
     * @return
     */
    @GetMapping("/2")
    String toMain2 () {
        // 获取shiro中的用户信息，类似于之前从session中获取用户信息
        String user = (String)SecurityUtils.getSubject().getPrincipal();
        LOG.info("当前用户：" + user);
        // 权限验证
        LOG.info("是否admin角色：" + SecurityUtils.getSubject().hasRole("admin"));
        LOG.info("是否具有menu:view权限：" + SecurityUtils.getSubject().isPermitted("menu:view"));
        return "main";
    }

    /**
     * 加载登录页
     * @return
     */
    @GetMapping("/login")
    String login () {
        return "login";
    }

    /**
     * 登录表单提交后，shiro处理认证，如果成功，则返回指定url，如果认证失败则由本方法处理
     * @param username
     * @param password
     * @param map
     * @return
     */
    @PostMapping("/login")
    String login (String username, String password, Map<String, Object> map) {
        map.put("error", "认证失败");
        return "login";
    }

    /**
     * 采用注解方式验证权限
     * @return
     */
    @RequiresRoles("admin")
    @GetMapping("/msg")
    @ResponseBody
    String getMsg () {
        return "true";
    }
}
